home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Programming / vbcc / machines / amigappc / libsrc / string / memmove.s < prev    next >
Encoding:
Text File  |  1998-06-24  |  913 b   |  55 lines

  1. ##
  2. ## vbcc-PowerPC libvc.a
  3. ##
  4. ## void *memmove(void *s1,const void *s2,size_t n)
  5. ## r3            r3       r4             r5
  6. ##
  7. ## v0.2 23.12.97 phx
  8. ##      check n=0
  9. ## v0.1 23.11.97 phx
  10. ##
  11.  
  12. .set    BYTECPY,16            # do byte-copy for n < 16
  13.  
  14.     .text
  15.     .extern memcpy
  16.  
  17.     .global    memmove
  18. memmove:
  19.     cmpwi    r5,0
  20.     beqlr
  21.     cmplw    r3,r4
  22.     blt    .memcpy            # copy ascending? -> memcpy()
  23.     add    r6,r3,r5
  24.     add    r4,r4,r5
  25.     cmplwi    r5,BYTECPY
  26.     blt    .bytecpy
  27.     extrwi    r7,r6,2,30
  28.     extrwi.    r8,r4,2,30
  29.     cmpw    cr1,r7,r8        # same alignment?
  30.     bne    cr1,.2
  31.     beq    .2            # 32-bit alignment
  32.     sub    r5,r5,r7
  33.     mtctr    r7
  34. .1:    lbzu    r0,-1(r4)        # copy 1-3 bytes to achieve alignment
  35.     stbu    r0,-1(r6)
  36.     bdnz    .1
  37. .2:    srwi    r7,r5,2
  38.     mtctr    r7
  39. .3:    lwzu    r0,-4(r4)        # word-copy
  40.     stwu    r0,-4(r6)
  41.     bdnz    .3
  42.     andi.    r5,r5,3            # remaining bytes?
  43.     beqlr
  44. .bytecpy:
  45.     mtctr    r5
  46. .4:    lbzu    r0,-1(r4)
  47.     stbu    r0,-1(r6)
  48.     bdnz    .4
  49.     blr
  50. .memcpy:
  51.     b    memcpy
  52.  
  53.     .type    memmove,@function
  54.     .size    memmove,$-memmove
  55.